package com.bitoon.basketdudes.web.xhr;

import com.bitoon.basketdudes.web.BaseAction;
import com.bitoon.basketdudes.web.jpa.Equipo;
import com.bitoon.basketdudes.web.datos.InfoCabeceraXHR;
import com.bitoon.basketdudes.web.jpa.Plantilla;

import java.util.*;
import javax.persistence.*;
import org.apache.log4j.Logger;

public class ListaEquipos extends BaseAction {
    
    private List<Equipo> datos;
    private InfoCabeceraXHR cabecera;
    private int pagina = 1;
    private int cuantos;

    // Parámetros de búsqueda por letras
    private String letras;

    // Parámetros del filtrado
    private String modificador_historico;
    private String modificador_media;
    private String modificador_nivel;
    private String modificador_posicion;
    private String numero_historico;
    private String numero_media;
    private String numero_nivel;
    private String numero_posicion;

    // Parámetros de búsqueda de cadena
    private String cadena;

    private Logger log = Logger.getLogger(ListaEquipos.class);

    public String execute() {
        try {
            String letraDesde = "";
            String letraHasta = "";

            if (modificador_historico != null) {
                // Filtrado
                buscaEquipos("d", "e");
            } else if (cadena != null) {
                // Búsqueda por cadena, si hay al menos 3 letras
                if (cadena.length() >= 3) {
                    buscaEquipos(cadena);
                }
            } else {
                // Acceso por defecto, navegación
                if (letras != null) {
                    if (letras.length() == 3) {
                        letraDesde = letras.substring(0,1);
                        letraHasta = letras.substring(2,3);
                    } else if (letras.equals("todos")) {
                        letraDesde = "a";
                        letraHasta = "z";
                    }
                } else {
                    letras="";
                }

                if (letras!=null && letras!="") {
                    buscaEquipos(letraDesde, letraHasta);
                }
            }
        } catch (Exception e) {
            log.error("Error", e);
        }

        return SUCCESS;
    }

    private void buscaEquipos() {
        buscaEquipos("a","c");
    }

    public String paginacion() {
        
        String cadena = (String)session.get("cadena_equipos_paginacion");

        buscaEquipos(cadena);
        return SUCCESS;
    }

    private void buscaEquipos(String cadena) {
        List<Equipo> retorno = null;
        EntityManager em = null;

        try {
            log.debug("Buscando " + cadena);

            session.put("cadena_equipos_paginacion", cadena);

            retorno = new ArrayList<Equipo>();

            em = emfBasket.createEntityManager(); // checked

            Query qc = em.createNativeQuery("SELECT * FROM basket.equipo WHERE LOWER(nombre || ' ' || nick) LIKE :nombre", Equipo.class);
            qc.setParameter("nombre", "%" + cadena.toLowerCase() + "%");

            int totalRegistros = qc.getResultList().size();
            log.debug("totalRegistros: " + totalRegistros);
            int totalPaginas = (totalRegistros-1)/LISTADO_MANAGERS_ELEMENTOS_POR_PAGINA + 1;

            int offset = (pagina-1) * LISTADO_MANAGERS_ELEMENTOS_POR_PAGINA;

            Query q = em.createNativeQuery("SELECT * FROM basket.equipo WHERE LOWER(nombre || ' ' || nick) LIKE :nombre", Equipo.class);
            q.setParameter("nombre", "%" + cadena.toLowerCase() + "%");
            q.setFirstResult((pagina-1)*LISTADO_MANAGERS_ELEMENTOS_POR_PAGINA);
            q.setFirstResult(offset);
            q.setMaxResults(LISTADO_MANAGERS_ELEMENTOS_POR_PAGINA);

            retorno = (List<Equipo>)q.getResultList();

            for (Equipo e : retorno) {
                //List<Plantilla> paux = e.getPlantilla();
                log.debug("e: " + e + ", plantilla: " + e.getPlantilla());
            }

            log.debug("retorno: " + retorno.size());

            cabecera = new InfoCabeceraXHR();
            cabecera.setCorrecto(1);
            cabecera.setActual(pagina);
            cabecera.setTotal(totalPaginas);

            int p1=0, p2=0;

            if (pagina <= (LISTADO_MANAGERS_HUECOS_LADO_PAGINA+1)) {
                p1 = 1;
                p2 = LISTADO_MANAGERS_HUECOS_LADO_PAGINA*2 + 1;
            } else if (pagina >= (totalPaginas-LISTADO_MANAGERS_HUECOS_LADO_PAGINA)) {
                p1 = totalPaginas - (LISTADO_MANAGERS_HUECOS_LADO_PAGINA*2);
                p2 = totalPaginas;
            } else {
                p1 = pagina - LISTADO_MANAGERS_HUECOS_LADO_PAGINA;
                p2 = pagina + LISTADO_MANAGERS_HUECOS_LADO_PAGINA;
            }
            if (p1 < 1) {
                p1 = 1;
            }
            if (p2 > totalPaginas) {
                p2 = totalPaginas;
            }
            cabecera.setPrimeraPagina(p1);
            cabecera.setUltimaPagina(p2);

            setDatos(retorno);
            setCabecera(cabecera);

        } catch (Exception e) {
            log.error("[buscaEquipos(String)]: Error: ", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }
    }


    private void buscaEquipos(String letraDesde, String letraHasta) {
        List<Equipo> retorno = null;
        EntityManager em = null;

        try {
            retorno = new ArrayList<Equipo>();

            log.debug("pagina: " + pagina);
            
            em = emfBasket.createEntityManager(); // checked

            // Hacer que la letraHasta sea la siguiente a la pasada. Si es c, que sea d; si es o, que sea p; etc.

            if (letras!=null && !letras.equals("todos")) {
                char l = letraHasta.charAt(0);
                int c = (int)l;
                l = (char)(l+1);
                letraHasta = "" + l;
            }

            log.debug("letraHasta: " + letraHasta);

            Query qc = em.createNamedQuery("Equipo.findByFirstLetters");
            qc.setParameter("letraDesde", letraDesde);
            qc.setParameter("letraHasta", letraHasta);

            int totalRegistros = qc.getResultList().size();
            int totalPaginas = (totalRegistros-1)/LISTADO_EQUIPOS_ELEMENTOS_POR_PAGINA + 1;

            int offset = (pagina-1) * LISTADO_EQUIPOS_ELEMENTOS_POR_PAGINA;
            
            Query q = em.createNamedQuery("Equipo.findByFirstLetters");
            q.setParameter("letraDesde", letraDesde);
            q.setParameter("letraHasta", letraHasta);
            q.setFirstResult((pagina-1)*LISTADO_EQUIPOS_ELEMENTOS_POR_PAGINA);
            q.setFirstResult(offset);
            log.debug("maxresults: " + LISTADO_EQUIPOS_ELEMENTOS_POR_PAGINA);
            q.setMaxResults(LISTADO_EQUIPOS_ELEMENTOS_POR_PAGINA);

            retorno = (List<Equipo>)q.getResultList();

            cabecera = new InfoCabeceraXHR();
            cabecera.setCorrecto(1);
            cabecera.setActual(pagina);
            cabecera.setTotal(totalPaginas);

            int p1=0, p2=0;

            if (pagina <= (LISTADO_EQUIPOS_HUECOS_LADO_PAGINA+1)) {
                p1 = 1;
                p2 = LISTADO_EQUIPOS_HUECOS_LADO_PAGINA*2 + 1;
            } else if (pagina >= (totalPaginas-LISTADO_EQUIPOS_HUECOS_LADO_PAGINA)) {
                p1 = totalPaginas - (LISTADO_EQUIPOS_HUECOS_LADO_PAGINA*2);
                p2 = totalPaginas;
            } else {
                p1 = pagina - LISTADO_EQUIPOS_HUECOS_LADO_PAGINA;
                p2 = pagina + LISTADO_EQUIPOS_HUECOS_LADO_PAGINA;
            }
            if (p1 < 1) {
                p1 = 1;
            }
            if (p2 > totalPaginas) {
                p2 = totalPaginas;
            }
            cabecera.setPrimeraPagina(p1);
            cabecera.setUltimaPagina(p2);

            setDatos(retorno);
            setCabecera(cabecera);

        } catch (Exception e) {
            log.error("[buscaEquipos]: Error: ", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

    }

    public String getLetras() {
        return letras;
    }

    public void setLetras(String letras) {
        this.letras = letras;
    }

    public List<Equipo> getDatos() {
        return datos;
    }

    public void setDatos(List<Equipo> resultadoBusqueda) {
        this.datos = resultadoBusqueda;
    }

    public int getPagina() {
        return pagina;
    }

    public void setPagina(int pagina) {
        this.pagina = pagina;
    }

    public int getCuantos() {
        return cuantos;
    }

    public void setCuantos(int cuantos) {
        this.cuantos = cuantos;
    }

    public InfoCabeceraXHR getCabecera() {
        return cabecera;
    }

    public void setCabecera(InfoCabeceraXHR cabecera) {
        this.cabecera = cabecera;
    }

    public String getModificador_historico() {
        return modificador_historico;
    }

    public void setModificador_historico(String modificador_historico) {
        this.modificador_historico = modificador_historico;
    }

    public String getModificador_media() {
        return modificador_media;
    }

    public void setModificador_media(String modificador_media) {
        this.modificador_media = modificador_media;
    }

    public String getModificador_nivel() {
        return modificador_nivel;
    }

    public void setModificador_nivel(String modificador_nivel) {
        this.modificador_nivel = modificador_nivel;
    }

    public String getModificador_posicion() {
        return modificador_posicion;
    }

    public void setModificador_posicion(String modificador_posicion) {
        this.modificador_posicion = modificador_posicion;
    }

    public String getNumero_historico() {
        return numero_historico;
    }

    public void setNumero_historico(String numero_historico) {
        this.numero_historico = numero_historico;
    }

    public String getNumero_media() {
        return numero_media;
    }

    public void setNumero_media(String numero_media) {
        this.numero_media = numero_media;
    }

    public String getNumero_nivel() {
        return numero_nivel;
    }

    public void setNumero_nivel(String numero_nivel) {
        this.numero_nivel = numero_nivel;
    }

    public String getNumero_posicion() {
        return numero_posicion;
    }

    public void setNumero_posicion(String numero_posicion) {
        this.numero_posicion = numero_posicion;
    }

    public String getCadena() {
        return cadena;
    }

    public void setCadena(String cadena) {
        this.cadena = cadena;
    }

}
